#!/bin/bash

# 部分重要路径
base_path=$(cat base-path.txt)
src_base=$base_path"/src"
cfg_sh_path=$base_path"/example/cfg-sh"
link_path=$base_path"/link/link.ld"

# 编译工具链名字（命令）
gcc="clang"
as="clang"
ld="ld.lld"
objcopy="llvm-objcopy"
objdump="llvm-objdump"

# gcc选项
gcc_opt="-g --target=riscv32 -march=rv32imac -mabi=ilp32 -fno-builtin -nostdinc -fno-stack-protector -fomit-frame-pointer -ffunction-sections -fdata-sections -Wall -mno-relax "$1

# as选项
as_opt="--target=riscv32 -march=rv32imac -mabi=ilp32"

# ld选项
ld_opt="-m elf32lriscv --gc-sections"

source_list=$(cat source-list.txt)
example_source_list=$(cat example-source-list.txt)
header_dir_list=$(cat header-dir-list.txt)

output_dir=$base_path"/output"

# 生成的文件名称
output_elf="a.out"
output_bin="a.bin"
output_txt="a.txt"

# 删除原有目录
rm -rf $output_dir

# 找到所有include目录
lib_opt=""
for header_dir in $header_dir_list
do
	lib_opt=$lib_opt" -I"$src_base"/"$header_dir
done

# 编译.c和.s生成.o，并生成.o文件列表字符串。
o_list=""
for src_file in $source_list
do
        # 扩展名
        ext=${src_file##*.}
        in_file=$src_base"/"$src_file
        out_file=$output_dir"/"$src_file".o"
        out_file_dir=${out_file%"/"*}
        if (($ext == "c" || $ext == "s"))
        then
                o_list=$o_list$out_file" "
                mkdir $out_file_dir -p
        fi
        if [ $ext == "c" ]
        then
                $gcc $in_file -o $out_file $lib_opt -c $gcc_opt
        elif [ $ext == "s" ]
        then
                $as $in_file -o $out_file -c $as_opt
        fi
done

for src_file in $example_source_list
do
        in_file=$src_file
        out_file=$output_dir"/"$src_file".o"
        out_file_dir=${out_file%"/"*}
        o_list=$o_list$out_file" "
        mkdir $out_file_dir -p
        $gcc $in_file -o $out_file $lib_opt -c $gcc_opt
done

$ld $o_list -T $link_path -o $output_dir"/"$output_elf $ld_opt
$objcopy $output_dir"/"$output_elf $output_dir"/"$output_bin -O binary
$objdump $output_dir"/"$output_elf -D > $output_dir"/"$output_txt